﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Collections.Generic;
using System.IO;

namespace Pittypat
{
    /// <summary>
    /// 表示某个用户的导航列表。
    /// </summary>
    public sealed class NavList : IComplex
    {
        /// <summary>
        /// 表示一个空的导航列表，这是一个只读字段。
        /// </summary>
        public static readonly NavList Empty = new NavList(null);

        // 表示一个空的导航列表。
        private static readonly IList<INavApp> EmptyApps = new INavApp[0];

        private IList<INavApp> apps;

        /// <summary>
        /// 使用 <see cref="INavApp"/> 列表初始化 <see cref="NavList"/> 的新实例。
        /// </summary>
        /// <param name="apps"><see cref="INavApp"/> 列表。</param>
        public NavList(IList<INavApp> apps)
        {
            this.apps = apps == null || apps.Count == 0 ? EmptyApps : apps;
        }

        /// <summary>
        /// 获取用户有权限访问和使用的 <see cref="INavApp"/> 的列表。
        /// </summary>
        public IList<INavApp> Apps
        {
            get
            {
                return this.apps;
            }
        }

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="ArgumentNullException">writer 为 null。</exception>
        public void Write(TextWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            writer.Write("[");

            if (this.apps != null && this.apps.Count > 0)
            {
                var list = new List<INavApp>(this.apps.Count);

                // 排除 null 元素
                foreach (var item in this.apps)
                {
                    if (item != null)
                    {
                        list.Add(item);
                    }
                }

                for (int i = 0; i < list.Count; ++i)
                {
                    list[i].Write(writer);

                    if (i < list.Count - 1)
                    {
                        writer.Write(',');
                    }
                }
            }

            writer.Write(']');
        }
    }
}
